package rauguelu.feria.tapas;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;

import rauguelu.feria.utils.Constants;
import rauguelu.items.Tapa;
import rauguelu.programaEventos.R;
import rauguelu.programaEventos.feedTweet.Tweet;
import android.app.Activity;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Typeface;
import android.media.JetPlayer;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.Settings.Secure;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

public class FeriaTapa extends ListActivity{

	BaseDatosFeriasHelper miBBDDHelper;
	
	private static final String FACEBOOK_APPID = "356546374395715";
	 
	private List<Tapa> tapasCursor; 
	private ProgressDialog progressDialog;
    private Dialog ventana;
    private boolean ordenadoPorBares = true;
    
    private final Handler progressHandlerSync = new Handler() {
 			public void handleMessage(Message msg) {
 				progressDialog.dismiss();
 	        }
 	    };
    private final Handler progressHandlerSinConexion = new Handler() {
 			public void handleMessage(Message msg) {
 				progressDialog.dismiss();
 				Context context = getApplicationContext();
 				CharSequence text = "Imposible conectar con el servidor. No se podr�n realizar la votaciones";
 				int duration = 1;

 				Toast toast = Toast.makeText(context, text, duration);
 				toast.show();
 	        }
 	    };
 	 	    
 	private final Handler progressHandler = new Handler() {
			public void handleMessage(Message msg) {
				progressDialog.dismiss();
				setListAdapter(new FeriaAdapter(tapasCursor,false));
	        }
	    };
	@Override
	protected void onRestart() {
	    	super.onRestart();
	    	crearBBDDTapas();
	    	Typeface font = Typeface.createFromAsset(getAssets(), "VSVBPSB.TTF");
		    TextView titulo = (TextView) findViewById(R.id.titulo);
		    titulo.setTypeface(font);
		       
	    	String syncStatus = getSyncStatus();
	    	if("N".equals(syncStatus))
	    	{
	    		// Lanzamos un evento de ProgressDialog para hacer esperar al usuario
		    	progressDialog = ProgressDialog.show(FeriaTapa.this,
		    			"", 
						"Cargando datos...");
		    	// Lanzamos la hebra para que el ProgressDialog sea visible
				        //obtenemos el numero de votos registrados desde el servidor
		    	HttpClient httpclient = new DefaultHttpClient();     
		    	HttpGet httpget = new HttpGet(Constants.urlServidor + "sync.php?deviceId=" + Secure.getString(getContentResolver(), Secure.ANDROID_ID));      
		    	ResponseHandler<String> responseHandler = new BasicResponseHandler();
		     
	    		String responseBody = null;
				
	    		try{
	    			responseBody = httpclient.execute(httpget, responseHandler);
	    			JSONArray jsonArray = null;
		    		JSONParser parser=new JSONParser();
					
					try {
						Object obj = parser.parse(responseBody);
						jsonArray =(JSONArray)obj;
						
					}catch(Exception ex){
						Log.v("TEST","Exception: " + ex.getMessage());
						throw ex;
					}
					miBBDDHelper.abrirBaseDatosFerias();
					if(jsonArray.size()>0)
					{
						if(((JSONObject)jsonArray.get(0)).get("id_tapa_3")!=null)
						{	
							
							miBBDDHelper.syncVotos(((JSONObject)jsonArray.get(0)).get("id_tapa_3").toString(),3);
						}
						if(((JSONObject)jsonArray.get(0)).get("id_tapa_2")!=null)
						{
							miBBDDHelper.syncVotos(((JSONObject)jsonArray.get(0)).get("id_tapa_2").toString(),2);
						}
						if(((JSONObject)jsonArray.get(0)).get("id_tapa_1")!=null)
						{
							miBBDDHelper.syncVotos(((JSONObject)jsonArray.get(0)).get("id_tapa_1").toString(),1);
						}
					}
					miBBDDHelper.cambiaSyncStatus("S");
					miBBDDHelper.close();
	    		}catch(Exception ex) {
	    			ex.printStackTrace();
	    			progressHandlerSinConexion.sendEmptyMessage(0);			    		}
	    		progressDialog.dismiss();	    	
					
	    		
	    	}
	        // Get all of the rows from the database and create the item list
	    	tapasCursor = getTapas();
	    	/*tapasCursor.moveToFirst();
	    	while (tapasCursor.isAfterLast() == false)
	    	{
	    		
	    		tapasCursor.moveToNext();
	    	}*/
	    	 
	        //startManagingCursor(tapasCursor);

	        // Create an array to specify the fields we want to display in the list (only TITLE)
	        String[] from = new String[]{"NOMBRE","DESCRIPCION"};

	        // and an array of the fields we want to bind those fields to (in this case just text1)
	        int[] to = new int[]{R.id.tapa,R.id.descripcion};

	        // Now create a simple cursor adapter and set it to display
	        BaseAdapter tapas = 
	            new FeriaAdapter(tapasCursor,true);
	        setListAdapter(tapas);
	    };
	 @Override
	    public void onCreate(Bundle savedInstanceState) {
	        super.onCreate(savedInstanceState);
	        setContentView(R.layout.feria_tapa);
	        
	    	crearBBDDTapas();
	    	Typeface font = Typeface.createFromAsset(getAssets(), "VSVBPSB.TTF");
		    TextView titulo = (TextView) findViewById(R.id.titulo);
		    titulo.setTypeface(font);
		       
	    	String syncStatus = getSyncStatus();
	    	if("N".equals(syncStatus))
	    	{
	    		// Lanzamos un evento de ProgressDialog para hacer esperar al usuario
		    	progressDialog = ProgressDialog.show(FeriaTapa.this,
		    			"", 
						"Cargando datos...");
		    	// Lanzamos la hebra para que el ProgressDialog sea visible
				        //obtenemos el numero de votos registrados desde el servidor
		    	HttpClient httpclient = new DefaultHttpClient();     
		    	HttpGet httpget = new HttpGet(Constants.urlServidor + "sync.php?deviceId=" + Secure.getString(getContentResolver(), Secure.ANDROID_ID));      
		    	ResponseHandler<String> responseHandler = new BasicResponseHandler();
		     
	    		String responseBody = null;
				
	    		try{
	    			responseBody = httpclient.execute(httpget, responseHandler);
	    			JSONArray jsonArray = null;
		    		JSONParser parser=new JSONParser();
					
					try {
						Object obj = parser.parse(responseBody);
						jsonArray =(JSONArray)obj;
						
					}catch(Exception ex){
						Log.v("TEST","Exception: " + ex.getMessage());
						throw ex;
					}
					miBBDDHelper.abrirBaseDatosFerias();
					if(jsonArray.size()>0)
					{
						if(((JSONObject)jsonArray.get(0)).get("id_tapa_3")!=null)
						{	
							
							miBBDDHelper.syncVotos(((JSONObject)jsonArray.get(0)).get("id_tapa_3").toString(),3);
						}
						if(((JSONObject)jsonArray.get(0)).get("id_tapa_2")!=null)
						{
							miBBDDHelper.syncVotos(((JSONObject)jsonArray.get(0)).get("id_tapa_2").toString(),2);
						}
						if(((JSONObject)jsonArray.get(0)).get("id_tapa_1")!=null)
						{
							miBBDDHelper.syncVotos(((JSONObject)jsonArray.get(0)).get("id_tapa_1").toString(),1);
						}
					}
					miBBDDHelper.cambiaSyncStatus("S");
					miBBDDHelper.close();
	    		}catch(Exception ex) {
	    			ex.printStackTrace();
	    			progressHandlerSinConexion.sendEmptyMessage(0);			    		}
	    		progressDialog.dismiss();	    	
					
	    		
	    	}
	        // Get all of the rows from the database and create the item list
	    	tapasCursor = getTapas();
	    	/*tapasCursor.moveToFirst();
	    	while (tapasCursor.isAfterLast() == false)
	    	{
	    		
	    		tapasCursor.moveToNext();
	    	}*/
	    	 
	        //startManagingCursor(tapasCursor);

	        // Create an array to specify the fields we want to display in the list (only TITLE)
	        String[] from = new String[]{"NOMBRE","DESCRIPCION"};

	        // and an array of the fields we want to bind those fields to (in this case just text1)
	        int[] to = new int[]{R.id.tapa,R.id.descripcion};

	        // Now create a simple cursor adapter and set it to display
	        BaseAdapter tapas = 
	            new FeriaAdapter(tapasCursor,true);
	        setListAdapter(tapas);
	        
	 }
	 
	 public String getSyncStatus()
	 {
		 	miBBDDHelper.abrirBaseDatosFerias();
			String status= miBBDDHelper.getSyncStatus();
			miBBDDHelper.close();
			return status; 
	 }
	 public List<Tapa> getTapas() {
		 	List<Tapa> listaEventos = null;
					
			miBBDDHelper.abrirBaseDatosFerias();
			listaEventos = miBBDDHelper.fetchAllTapas();
			//miBBDDHelper.close();
			return listaEventos;
		}
	 
	 public void crearBBDDTapas() {
			miBBDDHelper = new BaseDatosFeriasHelper(this);
			try {
				miBBDDHelper.crearDataBaseFerias();
			} catch (IOException ioe) {
				throw new Error("Unable to create database");
			}
		}
	 
	 
	 @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
      
        
        Intent i = new Intent(this, TapaDetalle.class);
        i.putExtra("_id", id);
        startActivityForResult(i, 1);
    }
	 
	 class FeriaAdapter extends BaseAdapter {
			
			private List<Tapa>  tapas;
			 CheckBox probada;
			private LayoutInflater inflater=null;
			private boolean bares;
			
			FeriaAdapter(List<Tapa> tapas,boolean bares) {
		    //super(context, c, from, to);
			inflater = (LayoutInflater)FeriaTapa.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		    this.tapas=tapas;
		    this.bares=bares;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
		    //View row = super.getView(position, convertView, parent);
			 View vi=convertView;
			 //if(convertView==null){
				 
				 if(bares && (position==0 || !tapas.get(position-1).getNombreBar().equals(tapas.get(position).getNombreBar())))
				 {
					 vi = inflater.inflate(R.layout.tapas_row_con_bar, null);
		        	 TextView tvNombreBar = (TextView) vi.findViewById(R.id.nombre_bar);
		        	 tvNombreBar.setText(tapas.get(position).getNombreBar());
		 	         Typeface font = Typeface.createFromAsset(getAssets(), "VSVBPSB.TTF");
		        	 tvNombreBar.setTypeface(font);
				 }
				 else
		         {
		        	 vi = inflater.inflate(R.layout.tapas_row, null);
		         }
			 //}
			 
		    ImageView icon = (ImageView) vi.findViewById(R.id.imagen);
		    
		    
		    TextView tapa = (TextView) vi.findViewById(R.id.tapa);
	//	    TextView descripcion = (TextView) vi.findViewById(R.id.descripcion);
		    
	    	Typeface font = Typeface.createFromAsset(getAssets(), "VSVBPSB.TTF");
	    	Typeface font2 = Typeface.createFromAsset(getAssets(), "VSVAB.TTF");
	 //   	descripcion.setTypeface(font);
		    tapa.setTypeface(font2);
		    tapa.setText(tapas.get(position).getNombre());

		    
		    
		    vi.setOnClickListener(new OnClickListener() {
				
				@Override
				public void onClick(View v) {
					  int position = getListView().getPositionForView(v);
					  long id = getListView().getItemIdAtPosition(position);
					  Intent i = new Intent(getListView().getContext(), TapaDetalle.class);
				      i.putExtra("_id", id);
				      startActivityForResult(i, 1);
				}
			});
		    
		    icon.setImageResource(FeriaTapa.this.getResources().getIdentifier(tapas.get(position).getRutaImagen(), "drawable", FeriaTapa.this.getPackageName()));
		    probada = (CheckBox) vi.findViewById(R.id.probada);
		    RatingBar imagenVotada;
		    imagenVotada =(RatingBar) vi.findViewById(R.id.indicator_ratingbar);
		    
		    
		    if(!"N".equals(tapas.get(position).getFlagVotada()))
		    {
		    	int puntos = Integer.parseInt(tapas.get(position).getFlagVotada());
		    	imagenVotada.setNumStars(puntos);
		    	imagenVotada.setRating(puntos);
		    	imagenVotada.setIsIndicator(true);
		    	imagenVotada.setVisibility(View.VISIBLE);

		    }
		    else
		    {
		    	imagenVotada.setVisibility(View.GONE);
		    }
		    
		    if(tapas.get(position).getFlagProbada()!=null && tapas.get(position).getFlagProbada().equals("S"))
		    {
		    	
		    	probada.setChecked(true);
		    }
		    else
		    {
		    	probada.setChecked(false);
		    }
		    
		    probada.setOnClickListener(new OnClickListener(){
				private Long id; 
				 Cursor tapa;
		    	@Override
				 public void onClick(View v) {
					 final int position = getListView().getPositionForView(v);
					 probada = (CheckBox)v;
					 id = getListView().getItemIdAtPosition(position);
				
					 
					 ventana = new Dialog (getListView().getContext());
					 ventana.requestWindowFeature(Window.FEATURE_NO_TITLE);
					 ventana.setCancelable(true);
					 ventana.setContentView(R.layout.comenta);
					 tapa = selectTapa(id);
					 
		            TextView nombreText = (TextView) ventana.findViewById(R.id.nombre_tapa_dialog);
			            
		            //nombreText.setText("");
		            
		            Typeface font = Typeface.createFromAsset(getAssets(), "VSVBPSB.TTF");
		            Typeface font2= Typeface.createFromAsset(getAssets(), "VSVAB.TTF");
		            nombreText.setTypeface(font);
		            
		  	  	  if(((CheckBox)v).isChecked())
		  	  	  {
		  	  		  
		  	  	 
		            TextView aceptar = (TextView) ventana.findViewById(R.id.aceptar);
		            aceptar.setTypeface(font);
		            aceptar.setOnClickListener(new OnClickListener() {
						
						@Override
						public void onClick(View v) {
							
			         		marcaProbada(id,"");
							ventana.dismiss();
						}
					});
					 
		            TextView cancela = (TextView) ventana.findViewById(R.id.cancelar);
		            cancela.setTypeface(font);
					 cancela.setOnClickListener(new OnClickListener() {
						
						@Override
						public void onClick(View v) {
							ventana.dismiss();
							probada.setChecked(false);
						}
					});
					 
					 ventana.show();
				 }
		  	  	  else
		  	  	  {
		  	  		  TextView texto =  (TextView)  ventana.findViewById(R.id.texto);
		  	  		  texto.setText("�Quieres desmarcar esta tapa?");
		  	  		  TextView aceptar = (TextView) ventana.findViewById(R.id.aceptar);
			            aceptar.setTypeface(font);
			            aceptar.setOnClickListener(new OnClickListener() {
							
							@Override
							public void onClick(View v) {
				        		 
				         		desmarcaProbada(id);
								ventana.dismiss();
							}
						});
						 
			            TextView cancela = (TextView) ventana.findViewById(R.id.cancelar);
			            cancela.setTypeface(font);
						 cancela.setOnClickListener(new OnClickListener() {
							
							@Override
							public void onClick(View v) {
								ventana.dismiss();
								probada.setChecked(true);
							}
						});
						 
						 ventana.show();
		  	  	  }
		    	 }	  
			});
		    
		    return (vi);
		 }

		@Override
		public int getCount() {
			return tapas.size();
		}

		@Override
		public Object getItem(int position) {
				return tapas.get(position);
		}

		@Override
		public long getItemId(int position) {
			return tapas.get(position).getIdTapa();
		}


		}
	 
	 private Cursor selectTapa(Long id) {
		 Cursor tapa = null;   
		 if (id != null) {
	        	miBBDDHelper.abrirBaseDatosFerias();
	            tapa = miBBDDHelper.fetchTapa(id);
	            startManagingCursor(tapa);
	            
	        }
		 return tapa;
	    }
	 
	 private void marcaProbada(Long id,String comentarios)
	 {
		 if (id != null) {
	        	miBBDDHelper.abrirBaseDatosFerias();
	            miBBDDHelper.marcaTapaProbada(id,comentarios);
	            
	        } 
	 }
	 
	 private void desmarcaProbada(Long id)
	 {
		 if (id != null) {
	        	miBBDDHelper.abrirBaseDatosFerias();
	            miBBDDHelper.desmarcaTapaProbada(id);
	            
	        } 
	 }
	 
	 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        /*super.onCreateOptionsMenu(menu);
        if(ordenadoPorBares)
        {
        	menu.add(0, 1, 0, "Ordenar por votos");
		}
		else
		{
			menu.add(0, 2, 0, "Ordenar por bar");
		}*/
        return true;
    }
	 
	 /*@Override
	 public boolean onPrepareOptionsMenu(Menu menu) {
		 menu.clear();
		 if(ordenadoPorBares)
	        {
	        	menu.add(0, 1, 0, "Ordenar por votos");
			}
			else
			{
				menu.add(0, 2, 0, "Ordenar por bar");
			}
		 return super.onPrepareOptionsMenu(menu);
	 }*/

    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {
        switch(item.getItemId()) {
            case 1:
               buscarTapasOrdenadas();
               ordenadoPorBares = false;
                return true;
            case 2:
            	tapasCursor = getTapas();
            	setListAdapter(new FeriaAdapter(tapasCursor,true));
            	ordenadoPorBares = true;
            	return true;
        }

        return super.onMenuItemSelected(featureId, item);
    }
    
    private void buscarTapasOrdenadas(){
    	
    	// Lanzamos un evento de ProgressDialog para hacer esperar al usuario
    	progressDialog = ProgressDialog.show(FeriaTapa.this,
    			"", 
				"Obteniendo votos...");
    	
    	// Lanzamos la hebra para que el ProgressDialog sea visible
		new Thread(new Runnable(){
			public void run() {

        		HttpClient httpclient = new DefaultHttpClient();     
     	    	HttpGet httpget =null;      
     	    	ResponseHandler<String> responseHandler = new BasicResponseHandler();
     	    
     	    	httpget = new HttpGet(Constants.urlServidor + "ordenaTapas.php");
     	    	String responseBody = null;
     	    	try{
     	    		responseBody = httpclient.execute(httpget, responseHandler);
     	    		
     	    		JSONObject jsonObject;
     	    		JSONArray jsonArray = null;
		    		JSONParser parser=new JSONParser();
					
					try {
						Object obj = parser.parse(responseBody);
						jsonObject =(JSONObject)obj;
						
						jsonArray =(JSONArray) jsonObject.get("idsOrdenados");
						Long idTapaOrdenado;
						Tapa temporal= null;
						for(int i=0;i<jsonArray.size();i++)
						{
							 idTapaOrdenado =Long.parseLong((String)((JSONObject)jsonArray.get(i)).get("id_tapa"));
							 int j=0;
							 for(Tapa tapa:tapasCursor)
							 {
								 if(tapa.getIdTapa()==idTapaOrdenado)
								 {
									 if(i!=j)
									 {
										 temporal = tapasCursor.get(i);
										 tapasCursor.set(i, tapasCursor.get(j));
										 tapasCursor.set(j, temporal);
									 }
								 }
								 j++;
							 }
							 
						}
					}catch(Exception ex){
						Log.v("TEST","Exception: " + ex.getMessage());
						throw ex;
					}
					
					
					
				}catch(Exception ex) {
					Log.v("TEST","Exception: " + ex.getMessage());
				} 
         		
    	    		
    			// Llamamos al progressHandler para que actualice el ListView
				progressHandler.sendEmptyMessage(0);
			}
		}).start();
		
    }
	  
}
